package com.dp.client.views.paquete;


import java.util.Date;

import com.dp.client.dto.AlmacenDTO;
import com.dp.client.dto.ClienteDTO;
import com.dp.client.dto.PaqueteDTO;
import com.dp.client.dto.VueloEnvio;
import com.dp.client.servicios.almacenes.IServiciosAlmacen;
import com.dp.client.servicios.almacenes.IServiciosAlmacenAsync;
import com.dp.client.servicios.paquete.IServiciosPaquete;
import com.dp.client.servicios.paquete.IServiciosPaqueteAsync;
import com.dp.client.util.Alerts;
import com.dp.client.views.clientes.ClientePrincipal;
import com.dp.client.views.clientes.WizardStage;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DockLayoutPanel;
import com.google.gwt.core.client.GWT;
import com.google.gwt.dom.client.Style.Unit;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.SimplePanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Widget;

public class RegistraPaqueteNuevo extends Composite {
	static Label [] states = new  Label [] {
				new Label("1. Seleccione Cliente Emisor" ),
				new Label("2. Seleccione Cliente Receptor" ),
				new Label("3. Asigne Destino y datos de Paquete" ), 
				new Label("4. Asigne Ruta"),
				new Label("5. Resumen Asignacion")};
	static WizardStage [] stages = new WizardStage [5];
	
	private DockLayoutPanel dockLayoutPanel;
	private VerticalPanel verticalPanelWiz;
	private VerticalPanel verticalPanelData;
	private Label lblPasos;
	private Button btnSiguiente;
	private int cur;
	private SimplePanel simplePanel;
	private HorizontalPanel horizontalPanel;
	private Button btnAnterior;
	private DatosEnvioPaquete datos;
	private boolean avanzar=false;
	
	public RegistraPaqueteNuevo( PaquetePrincipal padre ) {
		cur = 0;
		dockLayoutPanel = new DockLayoutPanel(Unit.EM);
		initWidget(dockLayoutPanel);
		
		datos= new DatosEnvioPaquete();
		verticalPanelWiz = new VerticalPanel();
		verticalPanelWiz.setSpacing(5);
		dockLayoutPanel.addWest(verticalPanelWiz, 17.8);
		stages[ 0 ] = new ClientePrincipal(true , padre ,datos);
		stages[ 1 ] = new ClientePrincipal(true ,datos);
		stages[ 2 ] = new DestinoPaquete(datos);
		stages[ 3 ] = new SeleccionarRutas(datos); 
		stages[ 4 ] = new ResumenPaquete();
		for( int i = 6 ; i  < 5 ; i++ ){
			stages[ i ] = new WizardStage() {
				Button btn = null;
				int cnt = 0;
				public void clear(){
					if( btn == null ){ btn = new Button(":3"); }
					btn.setText(":3");
					cnt = 0;
				}
				
				public Widget getWidget() {
					// TODO Auto-generated method stub
					if( btn == null ){
						btn = new Button();
						btn.addClickHandler( new ClickHandler() {
							@Override
							public void onClick(ClickEvent event) {
								cnt++;
								btn.setText( "cliked "+ cnt);
							}
						});
					}
					return btn;
				}
				
				@Override
				public boolean isValid() {
					// TODO Auto-generated method stub
					return cnt > 3;
				}
				
				@Override
				public String getError() {
					// TODO Auto-generated method stub
					return "cnt : " + cnt;
				}

				@Override
				public void actualizar() {
					// TODO Auto-generated method stub
					
				}
			};
		}
		
		
		lblPasos = new Label("Pasos :");
	
		verticalPanelWiz.add(lblPasos);	
		verticalPanelWiz.add( states[ 0 ]);
		lblPasos.setWidth("61px");
		verticalPanelData = new VerticalPanel();
		verticalPanelData.setSpacing(5);
		dockLayoutPanel.add(verticalPanelData);
		
		simplePanel = new SimplePanel();
		setSimplePanel( 0 );
		verticalPanelData.add(simplePanel);
		
		horizontalPanel = new HorizontalPanel();
		verticalPanelData.add(horizontalPanel);
		
		btnAnterior = new Button("Anterior");
		horizontalPanel.add(btnAnterior);
		
		btnSiguiente = new Button("Siguiente");
		horizontalPanel.add(btnSiguiente);
		
		btnAnterior.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if( cur == 0 ) return;
				boolean x = verticalPanelWiz.remove( states[ cur ] );
				cur--;
				setSimplePanel( cur );
				System.out.println( x );	
			}
		});
		
		btnSiguiente.addClickHandler( new ClickHandler() {
			@Override
			public void onClick(ClickEvent event) {
				if( stages[ cur ].isValid() == false ) {
					Alerts.dialogErrorPersonalizado( stages[ cur ].getError() );
					return;
				}
				
				if( cur == states.length - 1 ) {
					crearPaquete();
					while( cur > 0 ) verticalPanelWiz.remove( states[ cur-- ] );
					
					Alerts.dialogExitoCreacionDeObjeto("Paquete");
					for( WizardStage s : stages ) s.clear();
					cur = 0;
					setSimplePanel( 0 );
					return;
				}
				 if(cur==1){
					 ((DestinoPaquete)stages[2]).setIdAlmacen(datos.getOrigen().getId());
					 //enviarCorreo();
				 }
				 if (cur==3){
					 ( (ResumenPaquete ) stages[cur+1] ).cargarDatos(datos);
				 }
				cur++;
				stages[cur].actualizar();
				setSimplePanel( cur );
				verticalPanelWiz.add( states[ cur ]  );
			}
		});
	}
	
	protected void enviarCorreo() {
		
		IServiciosAlmacenAsync serviciosCorreo = GWT.create(IServiciosAlmacen.class);
		serviciosCorreo.enviarCorreo(datos.getEmisor(),datos.getReceptor(), datos.getPaquete() , new AsyncCallback<String>(){
			@Override
			public void onSuccess(String result) {
				
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
				
			}
		});
	}

	protected void crearPaquete() {
		PaqueteDTO paquete=new PaqueteDTO();
		paquete.setFechaRegistro(datos.getPaqueteEnvio().getSalida());
		
		Date aux=datos.getPaqueteEnvio().getSalida();
		int j=1;
		if (datos.getOrigen().getCiudad().getPais().getContinente().getId() !=
				datos.getDestino().getCiudad().getPais().getContinente().getId() )
			j=2;
		
		paquete.setFechaEstimadaLlegada(new Date(aux.getTime() + j * 24 * 60 * 60 * 1000));
		
		paquete.setAlmacenOrigen(datos.getOrigen().getId());
		paquete.setAlmacenDestino(datos.getDestino().getId());
		paquete.setClienteDestinatario(datos.getReceptor().getId());
		paquete.setClienteRemitente(datos.getEmisor().getId());
		paquete.setNroSecretoDestinatario(com.google.gwt.user.client.Random.nextInt(65000)+1);
		paquete.setNroSecretoRemitente(com.google.gwt.user.client.Random.nextInt(65000)+1);
		paquete.setAlmacenActual(datos.getOrigen().getId());
		paquete.setEstadoPaquete(1);//estado "por salir"
		
		
		IServiciosPaqueteAsync serviciosPaquete = GWT.create(IServiciosPaquete.class);
		serviciosPaquete.registrarPaquete(paquete , new AsyncCallback<PaqueteDTO>(){
			@Override
			public void onSuccess(PaqueteDTO result) {
				datos.setPaquete(result);
				asignarPlanDeVuelo();
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
		return;
	}

	protected void asignarPlanDeVuelo() {
		IServiciosPaqueteAsync serviciosPaquete = GWT.create(IServiciosPaquete.class);
		int idPqt=datos.getPaquete().getId();
		int [] vuelos=new int [datos.getRutas().vuelos.size()];
		for (int i=0;i<datos.getRutas().vuelos.size();i++){
			vuelos[i]=datos.getRutas().vuelos.get(i).idVuelo;
		}
			
		serviciosPaquete.generarPlanDeVuelo(idPqt, vuelos , new AsyncCallback<Integer>(){
			@Override
			public void onSuccess(Integer result) {
					
				datos.getPaquete().setPlanDeVuelo(result);
				
				String cad = String.valueOf(datos.getPaquete().getId());
				String codigo="";
				for (int i=0;i<9-cad.length();i++)
					codigo+="0";
				codigo = codigo.concat(cad);
				datos.getPaquete().setCodigo(codigo);
				
				actualizarPaquete(datos.getPaquete());
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});;
	}

	protected void actualizarPaquete(PaqueteDTO paqueteDTO) {
		IServiciosPaqueteAsync serviciosPaquete = GWT.create(IServiciosPaquete.class);
		serviciosPaquete.registrarPaquete(paqueteDTO , new AsyncCallback<PaqueteDTO>(){
			@Override
			public void onSuccess(PaqueteDTO result) {
				enviarCorreo();
			}
			@Override
			public void onFailure(Throwable caught) {
				Alerts.dialogErrorConexion();
			}
		});
	}

	void setSimplePanel( int cnt ){
		simplePanel.clear();
		simplePanel.add( stages[ cnt ].getWidget() );
	}

	public void limpiar() {
		while( cur > 0 ) verticalPanelWiz.remove( states[ cur-- ] );
		for( WizardStage s : stages ) s.clear();
		cur = 0;
		setSimplePanel( 0 );
		
	}
}
